{
 "metadata": {
  "name": "02_Linear_Regression"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<h1>Readings</h1>\n",
      "<ul>\n",
      "    <li>Bishop: 3.1.0-3.1.4</li>\n",
      "    <li>Ng: Lecture 2 pdf, page 4, LMS algorithm</li>\n",
      "    <li>Ng: Lecture 2 pdf, page 13, Locally weighted linear regression</li>\n",
      "    <li>Bishop: 3.3.0-3.3.2</li>\n",
      "</ul>\n",
      "<p><font color=\"blue\"><em><b>Regression</b></em></font>: Given the value of a D-dimensional input vector $\\mathbf{x}$, predict the value of one or more <em>target</em> variables</p>\n",
      "<p><font color=\"blue\"><b><em>Linear</em></b></font>: The models discussed in this section are <em>linear</em> with respect to the adjustable parameters, <em>not</em> \n",
      "    necessisarily with respect to the input variables. </p>"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<h1>Creating A Model</h1>\n",
      "In this notebook, our objective is to construct models that can predict the value of some target variable, $t$, given some \n",
      "input vector, $\\mathbf{x}$, where the target value can occupy any value in some space - though here we'll only consider the space of \n",
      "real valued vectors. We want the models to allow for uncertainty in the accuracy of the model and/or noise on the observed data. \n",
      "We also want the model to provide some information on our confidence in a given prediction. \n",
      "\n",
      "The first step is to contruct a mathematical model that adequately represents the observations we wish to predict. \n",
      "The model we will use is described in the next two subsections. It is **important to note** that the model itself is independent \n",
      "of the use of a frequentist or Bayesian viewpoint. It is *how we obtain the free parameters* of the model that is affected by using\n",
      "frequentist or Bayesian approaches. However, if the model is a poor choice for a particular observation, then its predictive \n",
      "capability is likely to be poor whether we use a frequentist or Bayesian approach to obtain the parameters."
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<h2><font size=\"4\">Gaussian Noise: Model Assumption 1</font></h2>\n",
      "We will *assume* throughout this notebook that the target variable is described by <br/><br/>\n",
      "    $t = y(\\mathbf{x},\\mathbf{w}) + \\epsilon$\n",
      "    <br/><br/>\n",
      "where $y(\\mathbf{x},\\mathbf{w})$ is an as of yet undefined function of $\\mathbf{x}$ and $\\mathbf{w}$ and $\\epsilon$ is a <font color=\"red\"><em>Gaussian</em></font> distributed noise component. \n",
      "\n",
      "**Gaussian Noise?** The derivations provided below all assume Gaussian noise on the target data. Is this a good assumption? In many cases yes. The argument hinges\n",
      "on the use of the [Central_Limit_Theorem](http://en.wikipedia.org/wiki/Central_limit_theorem) that basically says the the **sum** of many independent random\n",
      "variables behaves behaves like a Gaussian distributed random variable. The _noise_ term in this model, $\\epsilon$, can be thought of as the sum of features\n",
      "not included in the model function, $y(\\mathbf{x},\\mathbf{w})$. Assuming these features are themselves independent random variables then the Central Limit Theorom suggests a Gaussian model \n",
      "is appropriate, assuming there are many independent unaccounted for features. It is possible that there is only a small number of unaccounted for features\n",
      "or that there is genuine _non-Gauisian_ noise in our observation measurements, e.g. sensor shot noise that often has a Poisson distribution. In such cases, the assumption is no longer valid."
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<h2><font size=\"4\">General Linear Model: Model Assumption 2</font></h2>\n",
      "In order to proceed, we need to define a model for $y(\\mathbf{x},\\mathbf{w})$. We will use the *general linear regression* model defined as follows <br/><br/>\n",
      "    $y(\\mathbf{x},\\mathbf{w}) = \\sum_{j=0}^{M-1} w_j\\phi_j(\\mathbf{x}) = \\mathbf{w}^T\\mathbf{\\phi}(\\mathbf{x})$ <br/><br/>\n",
      "    where $\\mathbf{x}$ is a $D$ dimensional input vector, $M$ is the number of free parameters in the model, $\\mathbf{w}$ is a column \n",
      "vector of the free parameters, and \n",
      "$\\phi(\\mathbf{x}) = \\\\{\\phi_0(\\mathbf{x}),\\phi_1(\\mathbf{x}), \\ldots,\\phi_{M-1}(\\mathbf{x})\\\\}$ with $\\phi_0(\\mathbf{x})=1$ is a set of basis functions where \n",
      "    each $\\phi_i$ is in the real valued function space \n",
      "    $\\\\{f \\in \\mathbf{R}^D\\Rightarrow\\mathbf{R}^1\\\\}$. It is important to note that the set of basis functions, $\\phi$, <font color=\"red\">need\n",
      "    not be linear</font> with respect to $\\mathbf{x}$. Further, note that this model defines an entire class of models. In order to \n",
      "    contruct an actual predictive model for some observable quantity, we will have to make a further assumption on the choice of the\n",
      "    set of basis functions, $\\phi$. However, for the purposes of deriving general results, we can delay this choice.\n",
      "\n",
      "Note that that $\\mathbf{w}^T$ is an $1 \\times M$ vector and that $\\mathbf{\\phi}(\\mathbf{x})$ is a $M \\times 1$ vector so that the target, $y$ \n",
      "    is a scalar. This will be exteneded to $K$ dimensional target variables below.\n",
      "\n",
      "    "
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<h1>Frequentist View: Maximum Likelihood</h1>\n",
      "Let's now embark on the path of obtaining the free parameters, $\\mathbf{w}$, of our model. We will begin using a *frequentist*, or \n",
      "*maximum likelihood*, approach. This approach assumes that we first obtain observation training data, $\\mathbf{t}$, and that the *best* \n",
      "value of $\\mathbf{w}$, is that which maximizes the likelihood function, $p(\\mathbf{t}|\\mathbf{w})$.\n",
      "\n",
      "<p>Under the Gaussian noise condition it can be shown that the maximum likelihood function for the training data is <br/><br/>\n",
      "    \n",
      "    $p(\\mathbf{t}|\\mathbf{X},\\mathbf{w},\\sigma^2) = \\prod_{n=1}^N ND(t_n|\\mathbf{w}^T\\phi(\\mathbf{x}_n),\\sigma^2)$ <br/><br/>\n",
      "    \n",
      "    $=\\frac{N}{2}\\ln\\frac{1}{\\sigma^2} -\\frac{N}{2}\\ln(2\\pi) - \\frac{1}{2\\sigma^2}\\sum_{n=1}^N\n",
      "    \\{t_n -\\mathbf{w}^T\\phi(\\mathbf{x}_n)\\}^2$ <br/><br/>\n",
      "    \n",
      "    where $\\mathbf{X}=\\{\\mathbf{x}_1,\\ldots,\\mathbf{x}_N\\}$ is the input value set for the corresponding $N$ oberved output values contained in the vector \n",
      "    $\\mathbf{t}$, and $ND(\\mu,\\sigma^2)$ is the Normal Distribution (Gaussian). (I used ND instead of the standard N to avoid confusion \n",
      "    with the product limit).\n",
      "    \n",
      "    Taking the logarithm of the maximum likelihood and setting the derivative with respect to $\\mathbf{w}$ equal to zero, one can obtain \n",
      "    the maximum likelikhood parameters given by the <em>normal equations</em>: <br/><br/>\n",
      "    $\\mathbf{w}_{ML} = \\left(\\mathbf{\\Phi}^T\\mathbf{\\Phi}\\right)^{-1}\\mathbf{\\Phi}^T\\mathbf{t}$ <br/><br/>\n",
      "    where $\\Phi$ is the $N \\times M$ <em>design matrix</em> with elements $\\Phi_{n,j}=\\phi_j(\\mathbf{x}_n)$, and $\\mathbf{t}$ is the $N \\times K$\n",
      "    matrix of training set target values (for $K=1$, it is simply a column vector). Note that $\\mathbf{\\Phi}^T$ is a $M \\times N$ matrix, so that $\\mathbf{w}_{ML}=\\left(\\mathbf{\\Phi}^T \\mathbf{\\Phi}\\right)^{-1}\\mathbf{\\Phi}^T\\mathbf{t}$ is \n",
      "$(M \\times N)\\times(N \\times M)\\times(M\\times N)\\times(N \\times K) = M \\times K$, where $M$ is the number of free parameters and $K$ is the number of predicted \n",
      "target values for a given input. <br/>\n",
      "</p>\n",
      "\n",
      "Note that the only term in the likelihood function that depends on $\\mathbf{w}$ is the last term. <font color=\"red\">Thus, maximizing the likelihood\n",
      "function with respect to $\\mathbf{w}$ __under the assumption of Gaussian noise__ is equivalent to minimizing a \n",
      "sum-of-squares error function. </font>\n",
      "\n",
      "<p>\n",
      "    The quantity, $\\mathbf{\\Phi}^\\dagger=\\left(\\mathbf{\\Phi}^T\\mathbf{\\Phi}\\right)^{-1}\\mathbf{\\Phi}^T$ is known as the \n",
      "    <em>Moore-Penrose pseudo-inverse</em> of $\\Phi$. When $\\Phi^T\\Phi$ is invertible, the pseudo-inverse is \n",
      "    equivalent to the inverse. When this condition fails, the pseudo-inverse can be found with techniques such as <em>singular value decomposition</em>.\n",
      "</p>"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<h3>Example 1</h3>\n",
      "<h4>(a) Linear Data</h4>\n",
      "<p>Let's generate data of the for $y = m*x + b + \\epsilon $ where $\\epsilon$ is a random Gaussian component with zero mean. Given this data, let's apply the maximum likelihood \n",
      "    solution to find values for the parameters $m$ and $b$. Given that we know our data is linear, we chose basis functions $\\phi_0(x)=1$ and $\\phi_1(x)=x$. Thus, our \n",
      "    our model will be $y=\\theta_0\\phi_0(x) + \\theta_1\\phi_1(x)$, where presumabely the solution should yield $\\theta_0 \\approx b$ and $\\theta_1 \\approx\n",
      "    m$\n",
      "</p>"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numpy as np\n",
      "from matplotlib import pyplot as plt\n",
      "#in order to compare between examples, set a seed in random\n",
      "seed = 123456789\n",
      "np.random.seed(seed)\n",
      "def y(x,m,b,mu=0,sigma=1): return m*x + b + np.random.normal(mu,sigma,1)[0]\n",
      "#training data, with N data points\n",
      "N = 101\n",
      "M = 2\n",
      "t = np.empty(N)\n",
      "domain_bound = 1.0/N\n",
      "domain = np.empty(N)\n",
      "for i in range(N): domain[i] = i*domain_bound\n",
      "for i in range(N): t[i] = y(x=domain[i],m=4.89,b=0.57)\n",
      "#design matrix, phi, N X M\n",
      "phi = np.array([np.ones(N),domain]).T\n",
      "#find the solution\n",
      "#in this case case phi.T X phi is invertible so do the folloing:\n",
      "temp1 = np.linalg.inv(np.dot(phi.T,phi)) #inverse of phi.T X phi\n",
      "temp2 = np.dot(temp1, phi.T)\n",
      "w1 = np.dot(temp2,t) #solution\n",
      "print 'w1=',w1\n",
      "#assuming that phi.T X phi was not invertible we could find the pseudo inverse using the pinv function\n",
      "#we expect to obtain the same solution\n",
      "phi_pi = np.linalg.pinv(phi)\n",
      "w2 = np.dot(phi_pi,t)\n",
      "print 'w2=',w2\n",
      "#compute the model predicted values for the training data domain\n",
      "predicted_t = [w2[0]+w2[1]*x for x in domain]\n",
      "plt.plot(domain,t)\n",
      "plt.plot(domain,predicted_t)\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "w1= [ 0.88610652  4.47519348]"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "w2= [ 0.88610652  4.47519348]\n"
       ]
      },
      {
       "output_type": "display_data",
       "png": "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\nwv8HD4ZnlKp4rugAAAAASUVORK5CYII=\n"
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<h4>(b) Trigonometric Data</h4>\n",
      "<p>One common misconception regarding linear regression is that the basis functions are required to be linear. This is not the case. Indeed, the basis\n",
      "    functions need not even be polynomials. They must be <em>linearly independent</em>, i.e. orthoganol. It is only the dependence on the model parameters, $\\mathbf{w}_{ML}$, that must be linear. \n",
      "    Note that an example of a nonlinear parameter model would be $y=\\exp(a)\\sin(x)$ where $a$ is the free parameter.\n",
      "    Let's generate trigonometric data of the form $y = a + b\\sin(x) + c\\cos(x) + \\epsilon $ where again $\\epsilon$ is a random Gaussian component with zero mean. \n",
      "    Here we chose basis functions $\\phi_0=1$, $\\phi_1(x)=sin(x)$ and $\\phi_2(x)=cos(x)$. If you're wondering if we're cheating a bit here, the answer is yes.\n",
      "    In reality, we may not know ahead of time what the appropriate basis functions for the observed data should be. The appropraite choice may be suggested\n",
      "    by the data, knowledge of the problem, and other machine learing techniques (hopefully to be discussed later). In this example, our \n",
      "    our model will be $y=\\theta_0\\phi_0(x) + \\theta_1\\phi_1(x) + + \\theta_2\\phi_2(x)$, where presumabely the solution should yield $\\theta_0 \\approx a$,\n",
      "    $\\theta_1 \\approx b$ and $\\theta_2 \\approx c$. \n",
      "</p>"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numpy as np\n",
      "import math\n",
      "from matplotlib import pyplot as plt\n",
      "#in order to compare between examples, set a seed in random\n",
      "seed = 123456789\n",
      "np.random.seed(seed)\n",
      "def y(x,a,b,c,mu=0,sigma=1): return a + b*math.sin(x) + c*math.cos(x) + np.random.normal(mu,sigma,1)[0]\n",
      "#training data, with N data points\n",
      "N = 101\n",
      "M = 3\n",
      "t = np.empty(N)\n",
      "domain = np.empty(N)\n",
      "domain_bound = 4.0*math.pi/N\n",
      "for i in range(N): domain[i] = i * domain_bound\n",
      "for i in range (N): t[i] = y(x=domain[i],a=1.85,b=0.57,c=4.37)\n",
      "#design matrix, phi, N X M\n",
      "c1 = [math.sin(x) for x in domain]\n",
      "c2 = [math.cos(x) for x in domain]\n",
      "phi = np.array([np.ones(N),c1,c2]).T\n",
      "#find the solution\n",
      "#in this case case phi.T X phi is invertible so do the folloing:\n",
      "temp1 = np.linalg.inv(np.dot(phi.T,phi)) #inverse of phi.T X phi\n",
      "temp2 = np.dot(temp1, phi.T)\n",
      "w1 = np.dot(temp2,t) #solution\n",
      "print 'w1=',w1\n",
      "#assuming that phi.T X phi was not invertible we could find the pseudo inverse using the pinv function\n",
      "#we expect to obtain the same solution\n",
      "phi_pi = np.linalg.pinv(phi)\n",
      "w2 = np.dot(phi_pi,t)\n",
      "print 'w2=',w2\n",
      "#compute the model predicted values for the training data domain\n",
      "predicted_t = [w2[0]+w2[1]*math.sin(x)+w2[2]*math.cos(x) for x in domain]\n",
      "plt.plot(domain,t)\n",
      "plt.plot(domain, predicted_t)\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "w1= [ 1.96075676  0.40288363  4.46959679]\n",
        "w2= [ 1.96075676  0.40288363  4.46959679]\n"
       ]
      },
      {
       "output_type": "display_data",
       "png": "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\nwwk+AAAAAElFTkSuQmCC\n"
      }
     ],
     "prompt_number": 2
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<h2><font size=\"4\">Stochastic Gradient Descent</font></h2>\n",
      "<p> In cases where the training data set is very large or data is received in a stream, a direct solution using the normal equations\n",
      "    may not be possible. An alternative approach is the <em>stochastic gradient descent</em> algorithm. If the total error function, $TE$, is the sum of \n",
      "    a given error function, $E$, evaluated at each of the $N$ trianing inputs, $TE = \\sum_{i=1}^N E(\\mathbf{x}_i)$ then the stochastic gradient descent\n",
      "    algorithm is <br/><br/>\n",
      "    $\\mathbf{w}^{\\tau + 1} = \\mathbf{w}^\\tau - \\eta \\bigtriangledown E_\\tau$ <br/><br/>\n",
      "    where ${\\tau}$ is the iteration number and $\\eta$ is a learning rate parameter. For this type of total error function, the order of evaluation\n",
      "    does not change the result. If the error function is the sum-of-squares function, then the\n",
      "    algorithm is <br/><br/>\n",
      "    $\\mathbf{w}^{\\tau + 1} = \\mathbf{w}^\\tau + \\eta \\left(t_n - \\mathbf{w}^{(\\tau)T}\\phi_n\\right)\\phi_n$\n",
      "</p>"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<h3>Example 2</h3>\n",
      "Repeat the evaluation in example 1(b) using the gradient descent approach. Is the answer the same when using the same training data?"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numpy as np\n",
      "import math\n",
      "from matplotlib import pyplot as plt\n",
      "#in order to compare between examples, set a seed in random\n",
      "seed = 123456789\n",
      "np.random.seed(seed)\n",
      "def y(x,a,b,c,mu=0,sigma=1): return a + b*math.sin(x) + c*math.cos(x) + np.random.normal(mu,sigma,1)[0]\n",
      "N = 101\n",
      "M = 3\n",
      "w = np.zeros((M,1))\n",
      "phi = np.empty((M,1))\n",
      "eta = 0.25\n",
      "#create arrays to store the values as they are generated so they can be plotted at the end\n",
      "x = np.empty(N)\n",
      "t = np.empty(N)\n",
      "domain_bound = 4.0*math.pi/N\n",
      "for i in range(N):\n",
      "    x[i] = i * domain_bound\n",
      "    t[i] = y(x[i],a=1.85,b=0.57,c=4.37)\n",
      "    phi = np.array([[1],[math.sin(x[i])],[math.cos(x[i])]]) \n",
      "    w = w + eta*(t[i]-np.dot(w.T,phi))*phi #the learning model\n",
      "\n",
      "print w.T\n",
      "#compute the model predicted values for the training data domain\n",
      "predicted_t = [w[0]+w[1]*math.sin(item)+w[2]*math.cos(item) for item in x]\n",
      "plt.plot(x,t)\n",
      "plt.plot(x,predicted_t)\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "[[ 1.65071005  1.00202272  4.63906078]]\n"
       ]
      },
      {
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAD9CAYAAABOd5eOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXdYlFfah+9BsCBiQaWjoNKk2GtMsPeGxthiLOlroqmb\nuJsvppt1s4kpu+mxxN6NURNLsMQuFjoWEFBELGABqe/3x8nAAEMfeGeGc1+XlzPztgeY+c3z/s5z\nnqNRFEVBIpFIJCaNhdoBSCQSiaT6SDGXSCQSM0CKuUQikZgBUswlEonEDJBiLpFIJGaAFHOJRCIx\nAyok5rNnz8be3h5/f/+C127dusXgwYPx9PRkyJAhpKWl1ViQEolEIimbCon5rFmz2LVrV5HXFi1a\nxODBg4mNjWXgwIEsWrSoRgKUSCQSSfloKjppKD4+ntGjRxMWFgaAt7c3+/fvx97enmvXrhEUFER0\ndHSNBiuRSCQS/VhW9cCUlBTs7e0BsLe3JyUlpcQ+Go2m6pFJJBJJHaayk/MNMgCq0WhKFW5FUUz2\n39tvv616DDJ+9eOoi/GbcuzmEH9VqLKYa+0VgOTkZFq3bl3VU0kkEomkmlRZzMeMGcOyZcsAWLZs\nGePGjTNYUBKJRCKpHBUS8ylTptCnTx9iYmJwdXXlp59+4o033mD37t14enqyb98+3njjjZqOtdYJ\nCgpSO4RqIeNXF1OO35RjB9OPvypUuJqlSifXaKrs/0gkEkldpSraKWeASiQSiRkgxVwikUjMACnm\nEolEYgZIMZdIJBIzQIq5RCKRmAFSzCUSicQMkGIukUgkZoAUc4lEIjEDpJhLJBKJGSDFXCKRSMwA\nKeYSiURiBkgxl0gkEjNAirlEIpGYAVLMJRKJxAyQYi6RSCRmgBRziUQiMQOkmEskEokZIMVcIpFI\nzAAp5hKJRGIG1LiYt28PTz8Nq1fDrVs1fTWJRCKpm9T4gs7nzin88Qfs3g1xcXD6NFhZ1dQVJRKJ\nxPSpyoLONS7m2tMrCgwbBiNGwLx5NXVFiUQiMX2MWswBoqLg4YchIgJat66pq0okEolpUxUxr7Zn\n/tFHH9GxY0f8/f2ZOnUqWVlZpe7r4wMzZsCCBdW9qkQikUh0qZaYx8fH89133xEaGkpYWBh5eXms\nWbOmzGP+7//g11/hxInqXFkikUgkulhW52BbW1usrKzIyMigXr16ZGRk4OzsXGSfhQsXFjwOCgoi\nKCiIBQvgs89g5crqXF0ikUjMg5CQEEJCQqp1jmp75t9++y2vvPIKjRo1YujQoaxYsaLw5KX4Pvv3\nwz//CQcPVufKEolEYp7Uumd+8eJFPvvsM+Lj47l69Sr37t1jZQXSbScnuHq1OleWSCQSiS7VEvOT\nJ0/Sp08f7OzssLS0JDg4mMOHD5d7nKMjJCeLckWJRCKRVJ9qibm3tzdHjx4lMzMTRVHYs2cPvr6+\n5R5nYwOWlpCeXp2rSyQSiURLtcQ8MDCQGTNm0K1bNwICAgB4+umnK3SstFokEonEcNTqpCFdBgwQ\n9eaDBtXU1SUSicQ0UWXSUFVxchK+uUQikUiqj2pi7ugobRaJRCIxFKpm5lLMJRKJxDBIm0UikUjM\nAGmzSCQSiRkgbRaJRCIxA1QrTbx/H1q2hIwM0GhqKgKJRCIxPUyqNLFxY2jQANLS1IpAIpFIzAfV\nxBykby6RSCSGQlUxl765RCKRGAbVxVyWJ0okEkn1kTaLxOi5fh1SU9WOQmJO7Ntnfl1bVc/MdcX8\nwQO4fVu9eCTGyQcfwKJFakchMSdefBF++03tKAyL6mKua7P8+9/w2mvqxSMxTsLCIDJS7Sgk5kJ2\nNsTEQGys2pEYlmot6FxdimfmW7dCixbqxSMxPhRFiHnjxmpHIjEXYmIgN9f8xNxoPPMrV+DUKTkg\nKinK9euQlyf+v3dP7Wgk5kBYGDg7SzE3KLprgW7fDgMH6hfzP/6AhQuFpy6pW4SFgb8/eHlBdLTa\n0UjMgbAwCA4WGbo5rUOsqphbW0OjRmLQc+tWmDNHjDDn5BTdb9cu+OYb6NoVTpxQJ1aJOoSHCzH3\n8ZG+ucQwhIVB//7i8c2b6sZiSFQVcxDZeWwsHDwIw4dDq1aQklJ0n6Qk+Phj+Oc/YdQoWL1anVgl\ntU9YGPj5ga8vREWpHY3EHNAmCJ6e5mW11NoAaE5eDhGpEVy/f53U+6k0rt+YQR6DcHKyYelS6N0b\nmjYttF5cXAqPTUoCV1fxbWplBUuXwpQptRW5RE3CwmD2bPEFv2yZ/n1uZ95mb9xe7mffx62pG65N\nXfFo7oGFRvVcRWJk3LkDN26Ah0ehmPfpo3ZUhqHGxTwzJ5MfTv/Avw//G2sra5yaONG6cWtSM1KZ\nsXkGtl0e4c/fn2Txk2OBQjHXJSmpUNz79IFnnoH8fLCQn1WzJj9fWCsdO4KdXVGbRVEUfjj9Az+e\n/pHw6+H0a9OP5g2bk3gnkbjbcdjUt+HtR97m0Y6PSlGXFBAeLu7yLCxkZl5p3Je408ulF2snrqWn\nS88i29IepDHjvR388vBr7Gu6gccffImjY9MiYp6fLypdnJ3FcycnsLUVfwRv75qOXqImcXGiVLVZ\nM1GamJQkBsFTHlxmzrY53Mm6w/sD3ufhNg/T0LJhwXGKovD7xd95O+Rt3jvwHt+O/pY+rmaSfkmq\nhXZAHYSYr1+vbjyGpNopS1paGhMnTsTHxwdfX1+OHj1aZPveGXvZMnlLCSEHaNawGQNbT8Xvz9M4\ntGhC4NeB5DoeLiLmN26ID7K1deFrvXvDkSPVjVxi7ISHC78chL3m4QFf7FtHt++6MdhjMIfnHGZI\nuyFFhBxEL+ih7YdyZM4R3u3/LuPWjGNz1GYVfgKJsaEdgwGZmZdg3rx5jBgxgg0bNpCbm8v9+/eL\nbO/YumOZx48ZA/7+jRkw4L/8EvMLU9eOY9D17UAPoKjFoqVPHzh8GGbNqm70EmNGN4sCsO21kQ9D\n5xHy5B4CHQLLPV6j0RDsE0zbZm0ZvXo0V+9e5W89/laDEUuMnfBwGDdOPO7QAS5cgKjrMXi2bE89\ni3rqBldNqpWZp6enc/DgQWbPng2ApaUlTZs2rdQ53N1hwADxeLTXaOa1/ZGdzcYQmSoMUu3gpy5a\nMZeYN7qZ+Y7zOwhzfZ5Hs3cWCPkrr8CPP5Z/ni6OXTg06xCfH/+cz499XoMRS4wZ7WxibYJgYwNN\n3C7y8E8Pcy7lnLrBGYBqZeZxcXG0atWKWbNmcfbsWbp27cqSJUuw1vFEFi5cWPA4KCiIoKCgMs85\n2msUqzZ9wtCfh3Jw1kGSktqWyMwDAiAhQdSnN29enZ9Aoga3b8Pdu+DmVvZ+YWHwxhtw4PIBZm6Z\nyd/bbOPsr50AuHQJPv9c3Nn9lUuUiXtzd36b/hu9vu9FgH0AQW2Dqv+DSEyK5GQx8Nm6tXh+N+su\n98eMZbbT23R27KxqbCEhIYSEhFTvJEo1OHHihGJpaakcP35cURRFmTdvnvLWW28VbK/K6S9fVhRn\nZ0X59MinSqevOymvvZGlvPdeyf3691eUnTurHLpERf7zH0WZPbvsfR48UJSGDRUl8Waq4vSJk7Lr\n/C7l7FlF8fUV22fPVpTHH1cUR0dFyc+v+LV3X9ytOPzbQUlISyh47f33FWX8eEWZPl1RnntOUa5c\nqcIPJTF6du0SuqEoipKXn6eMXT1W8X7tKeXLLyvxBqolqqKd1bJZXFxccHFxoXv37gBMnDiR0NDQ\nan25ODiIPhwvdJ+Hi60LOzIWlsjMQQyCSqvFNLlyRQxsl0VMDLRpqzD39yeZ6j+Voe2H4ukpMvLo\naDFjeMkSUe2UkFDxaw/yGMTLvV4meF0wD3IfsHo1LF8O06bBkCHibsDcWqNKBNrJQgDv7X+PGxk3\nmNn6S86fN48V5asl5g4ODri6uhL715Dwnj176Nix7AHP8qhfX5Qe3ryp4fvR33O+8U+k2R4qsZ/0\nzU2X5OTyp1GHhYFNv++5nH6Z9/u/D0DDhmIwfM4cmDtXWGxV+VJ/tc+ruDV148XNbzNvHqxZAxMm\nwOOPixnGERFV/MEkRo3WLz9z7QxfnfiK9Y+ux9ervtlUtFS7NPGLL75g2rRpBAYGcu7cORYsWFDt\noLQTh+xt7Glx5Gs+uTSDu1l3i+zTqxccPy466klMi6tXy8/M/4yOJcppAauCV9HAskHB676+Qmzn\nzxfPq1KmqtFo+HTQV/x0+kfmvBlGZx27tGNHkcFJzI+YGOjglcdTvzzFokGLcGziaFblidUW88DA\nQE6cOMHZs2fZtGlTpatZ9KHbTTHt6Fj6u/fnzb1vFtnHzk5MJJIfPNOjvMxcURQ2Zz/POLt/4tPK\np8i2IUPg3XfFRCKo+pyDbz5xwDflPfbbPkO+kl/wup+ffE+ZK3FxsD/jS2zq2zCrk6hrdncXFXPZ\n2SoHZwCMcp6zVsxv3hS31p+NWMy6iHUF5YpaeveGP/9UKUhJlUlOhlu3hN+tj20x27iTn8wc/5I1\n4X/7m1jyS0u3biJTz8ys+PUfPBBdOLe89TQKCt+Hfl+wzc1NdO6UyxeaFxkZkKYk8PnZ9/hm1Ddo\nNMInr19flD5fuqRygAbAqMVcO2GoRaMWLOi3gFd/f7XIfkOHwrZtKgUpqRL370NWFjRpon9B3azc\nLF7d/SrWBz/Fo235lbONGglr5OTJisfwyy8QGAjubS34ZtQ3/HPfP0m5J1p1WliI80nf3LyIjwer\n0fOZ13MennaeRbY984x59Hkyyh9BV8y1E4ae7/48F25d4LcLhaUGo0fD0aOi+kViGiQni/46dnb6\nrZYvjn9Bh+ZepIcO0VvFpI/KWi3LlsHMmeJxgH0AU/2n8sHBDwq2+/lJMTc3doYdJbf1CV7rW3KR\n4VdfFVP7TR2jF3PtB7p+vfosHryYV35/hdz8XED0axk1yrya5Zg7ycni76tPzK/fv86iQ4t4yfcT\nnJzAsoJT2ioj5teuCWsuOLjwtQX9FrAybCUJ6aLGUfrm5se3F/9Bj8z/K9HHx5wwGTEHGOM1hlaN\nW/Hj6cI53FOmwKpVKgQpqRK6Yl68ouWDgx8wLWAaFre9aNu24ufUinlFlgBbuVL05tBdILp149Y8\n0/UZ3jvwHiArWsyNvZf2cj0rgaH2M9UOpUYxajFPTCwq5hqNho8GfsSHBz8kJ0+sLTdkiCgtio9X\nJ1ZJ5bh6Vb/NknIvhRVnV/BG3zeIj6dSYt6mDWg0+t8DK1YIW0VRxL+lSwstFl1e6/Mam6M2c+HW\nBfz8RE2yOa0PWVdRFIUF+xbQIfFd2ntYqR1OjWJSYg7Qy6UX7Vq0Y1WYSMetrMSEjzVrVAhUUmm0\nmXnLlkXF/D9H/8NU/6k4NnGstJhrNKVbLV98Af/4B4wdCzt3wr170K9fyf2aN2rOvJ7zeGf/Ozg4\nCCGXYzGmz7aYbWTmZJJz5jHc3dWOpmYxSjFv3FiIdEREyY6JAAseWsBHhz4iL1/MGJo6Va4Lairo\n88xvZtzk+9Dveb3v6wCVFnPQPyM4K0u8h8LDRXO2MWNgxozSKxfm95rP7xd/J+pGpPTNzQBFUXhn\n/zu81/894uMspJirhaOjyIz0VTQMcB9As4bN2BS1CYCHHhJ1y7ICwfjRZ7MsObaEYJ9g3JqKNoqX\nL1dezPv2LTnn4MwZUaXQrBm8/z6cOycqF0qjSYMmvNDjBT458omsaDED/oj/g8zcTPrZjyY3V7zn\nzBmjFnNbW1GPXByNRsM/+v2DDw5+gKIoWFjAo4/Cxo21H6ekchTPzNMfpPPfE//ljb5vFOxTlcy8\nSxc4f1601tVy/Dj06FH43NdX//tJl+e6PcfmqM24+lyTmbmJ8+/D/+bV3q9yOV5k5Rrz6KdVKkYt\n5mXVGY/0HEm+ks+O8zsAscDFwYO1FJykyhSvZvn65NcMaz+Mdi3aAWJadUpK2X97fTRoAJ07i3kH\nWoqLeUWws7Zjst9komy+kmJuQrz4Irz9duGgdfj1cE5fO820gGnExWH2FguYsJhbaCx4ve/rfHbs\nM0B4pseOQW5uLQUoqTSZmWIGqJ3dX2J+K5evTnzFy71fLtgnKUn87StaY65L375FffPjx6FnyaVn\ny2V+r/nsuP4NYdEZsqLFBDh/XoyZ7dwJTz4pNOA/R/7D3O5zaWjZUIq52jg7l78SzaO+jxKWEkZU\nahQtWoj9z5ypnfgklefaNdGvXqMR1SxXbLbh2tSVLo5dCvapisWipU+fQt/89m1xF+DjU/Yx+vC0\n86SPW28suiwjMbFqsUhqj0WLRM+effvE33zoxGS2RG/h2W7PAkgxV5snn4T33it7nwaWDXiq61N8\ndeIrQJScHSrZ+lxiJGgtFhCZeZrnF7zQ44Ui+1RXzI8dE22RT5wQPnq9Kq7R+0rvV8jr/ikHDpbS\nDUxiFCQkwJYtwmaxsRGLliQ4fIF39jTsrMWIpxRzlWnaVGRx5fFs12dZFbaKO1l3eOghKebGjLaS\nBeDC3XPkt4hleJsJRfapjpi3bCm+LMLCquaX69LPrR+tmzZlyY4dVT+JpMb597/FYiUtWojn+Zos\nbrh9T8ovLxRYZFLMTQRnW2cGeQxi+dnlBWIufU7jRDcz//L4lzSJeZb020Vn5cXHixmdVUVbolhV\nv1yLRqPh1Uee44zlN6SmVv08kpojJQV+/hleLhxyYXP0Zrq6BFAvzZPjx4UWxMdLMTcZ5vaYy5fH\nv8TVVcHKCi5cUDsiiT60Yn4r8xbrI9fjkvJ0iWZb1cnMoVDMjx2rXmYO8ETXx7Bo8yffrJbGuTHy\n3/+K3ky6d/Bfn/yaZ7s9y8yZonVDSoqYhGhjo1aUtYdZiHk/t340sGzA3rg90jc3YrQ2y9IzSxnZ\nYSQONvYlxLwqE4Z06dsXtm8XszwrW95YnMb1GzPYcQrfnPiheieS1Ajh4RAUVPg8+kY0MTdjGOs1\nlscfh3XrICqqbmTlYCZirtFoeK7bc3wb+q30zY2Y5GRwcFD44fQPPN316RL9WXJyRMVLdUTY01Os\nHtOzp2Emibw75hmuOnxPzHlZ82pspKZCq1aFz7859Q2zO8/Gqp4Vrq7QtSt89pkUc5Njit8Udl/c\nTcfuN6SYGynJyXCj4TFy8nLo59avROfEpCRxy2xVjeZ2Go2oaqmuxaKli3MArRq48u5qORBam3zz\nTfnN81JToXVr8TgzJ5MVZ1fwVJenCrbPnClWIpNibmI0bdiU0V6jCc1dSUqK7HhnLOgORl+9Cr/f\n+IHZnWej0WhKiHl1/XItX3wBzz9f/fNoearzM2xN+lYOrNcip06Vv+CIbma+PnI9PZx70LZZ24Lt\n48eLliBSzE2Q2Z1m89OZH+jdR5HZuRGwdavwNLOyxDT99Mx7/Bq3gScCnwBKLlBhKDFv00Y01zIU\nb4yeRGbLI/x2NMFwJ5WUye3booa8NHJzxRqy2pLE70O/5+muTxfZp1EjUbrYv38NBmpEmJWYP9L2\nEe5l38O5ayjnzqkdjeTUKbHQ8osvCi/cpud6HnJ7CMcmoj6xeGYeHg5eXioFWwaN61vTLvMxvju+\nQu1Q6gzlifnNm+ILu149uHT7EtE3ohnRYUSJ/Z56yjzW96wI1RbzvLw8OnfuzOjRow0RT7Ww0Fgw\nq9MsLjb9QU7DNgIuXBCZ0cGD8O67kOv/A3M6zynYXlzM//xTVKMYIwNbzuCPW8tRpNdSK5Qn5roW\ny/Kzy5niP4X69erXTnBGSrXFfMmSJfj6+qIxkv6SMzvN5FTWWuKSMtUOpc5z4QJ06iSmW6/ZE0NO\nkwuM7DCyYLuumGdkiJmb3burFGw5DPPrSVYWHLtyTO1Q6gRpacKCy8jQv10r5vlKPsvPLmdGwIza\nDdAIqZaYJyUlsWPHDp588kmjyVhcm7oS2LI7UcpmtUOp81y4AO3bi9vcMW8tY1Dr6VjVKyxV0S1N\nPH4c/P3B2lqlYMvB31+DVcQMlp9drnYodYLbt4UfXtodtlbMDyUcwtrKukiztrpKFRqNFvLSSy+x\nePFi7ty5U+o+CxcuLHgcFBREkG6Vfw0xq8sMnjq8AkWZavYN6Y2VW7dEw6uWLUX2dPjuKrZO3lpk\nH93M/M8/xYpRxkrbtpB9ajprw7vy6dBPaWDZQO2QzJb8fLhzR7wfLl/WP46iLUtcdnYZTwQ+YTTO\nQFUJCQkhJCSkWueosphv376d1q1b07lz5zKD0BXz2uKxwLE86fw80YnX8XFrXevXlxRm5RoNHLr8\nJ00aNCHAPqDIPk2bigWWc3LERK9nnlEp2ApgYQG+Tm3AOoDtsduZ4Duh/IMkVeLOHXGH5uFRum+e\nmgrNWmXwv6hNRD4fWbsB1gDFE9133nmn0ueoss1y+PBhtm3bhru7O1OmTGHfvn3MmGEcvlXj+o1p\nmjKKn06sVTsUs+L0aZg+vWL7asUcYGXYSqb5TyuRPVlYQPPmwhs9csR4Bz+1+PmBf/4Mlp8rtFqi\no0UmKTEcaWnifeHmVraYX7HdTC+XXgXVUXWdKov5hx9+SGJiInFxcaxZs4YBAwawfLnx+IleWdPZ\nemml2mGYFXFxsHdvxfbVinl2XjYbIjcw1X+q3v3s7GD/frC3Lzo12xjp2BGs4yewP34/qfdTyc0V\nX0ChoWpHZl7cvl0xMT+r/CwHPnUwWJ25sXlWXZoNIjkzjgu3ZAtFQ5GWJurF09LK31cr5jvP78Sv\ntR9uTfUvG2VnJyYXGbNfrqVjR4gNb8JIz5Gsj1zP0aNibODqVbUjMy8qIuZJt1O58OAIY7zG1G5w\nRoxBxPyRRx5h27ZthjiVwWjrZkn7rMdYeU5m54YiPV38HxVV/r5aMf857Gem+U8rdb+WLWHHDtMQ\ncz8/iIiAyR0nsyZ8Ddu3izGB5GS1IzMvbt8WE4LKEvO4Rht42HE4jes3rt3gjBizmgGqi5sbtLgy\njZVhK42mbNLU0Yp5ZAXGmy5cgNZu6ey+uJuJvhNL3c/OTgx4GbtfDuDqKgZse9gNJSI1gs17Exk8\nWIq5odF65q6uovmavjGJm46reazjlNoPzogxWzF3dYV7MT3IV/I5efUkILqwHZNzPvSSnQ0HDpS9\nT1qaKAcrLzO/cwfu34c/b21igPsAmjdqXuq+dnbCK+/QoQpB1zIaDfj6wvno+gxyHs/V5usYM0aK\nuaHR2iyNGolGWcWb5l2+nUhOswgmBA5VJ0AjxWzF3M0NEhM0TAuYxurw1QB89ZXwZyUlOX1a9LEo\ni/R06N27fDG/eFFYLOsi1jLZb3KZ+9rZCYvFyIZcSsXPT/SQaX19Cg26rcbZWYq5odGKOYimacWt\nlqUn19Igbjw2jWStvy5mK+aOjqLkLdhzEusj15OVnc+pUxWzCOoi6eliMK8s0tIqJuYXLoCr1w2O\nJB0pMn1fH9Onw/vvVzJYFenYUfjmsb8Fkdc4iVzb81LMDYzWMwf9vvm6qNW0SpEWS3HMVswtLcVC\nB02zO9K0QVPWHDqKhYUU89LQinlZNdPp6dC5s8hES+uZAULMc9tvZlj7YeUOULm4COvCVOjYUVh1\nh/+sx2N+kzh2f60UcwOj9cxBiPnly4XbYm/Gcu3+VdrkB6kSmzFjtmIOwjdPSIBJHSex/NQ6xo4V\nvR4ePFA7MuMjPV0IuXaQUx9paaJfRvv2EBNT+n4XLsDlJmt5rONjhg9UZfz84MQJsSzdjC6T+TVh\nNddSFPLy1I7MfNC1WYpn5qvDVtOrySRat6qnTnBGjFmLufaNMKnjJI7eWU+fvvm4u0NsrNqRGR/a\n9jplWS3p6eL218enbKsl8nIKiXknGd5+uGGDNAIcHcXvYNQo6O3Sm4yc+9h4hBdZZENSPcoS8/WR\n6/HJm2T0E8zUwOzFPDERvFt6k3evJQ07/Imvr7Ra9KHNyHX7ixcnLU30U/H1LVvMozQbGdxmJI2s\nGhk2SCNAo4H58+HRR8VEuYm+E2nQaYO0WgxIaZ55VGoUaQ/SsEnrLcVcD2Yv5gkJIuvMPzeJ0Kx1\nUsxLoTwxVxSxT9OmIjMv7Xd4/z7cdVvHjG6TaiZQI+Dtt8HZWTye6DuR+23XSzE3IMU9c62Yr49c\nzwTfCdy8YSHFXA91QsxPngQ/i0fZFLMBb5+8Cs1grGtoxbw0m+X+fahfX/wry2Y5GnEV7M8xosOw\nmgnUyOjp3BPq3+NUgswQDIGiFLVZWrUSE7UyMoSYP+r7aJFVhiSFmLWYawdAjx2DIH9PHGwcyGx9\nUGbmekhPByen0jNzrV8OYrGJuDjRurY4q05vwuneqDrT71uj0eDDBP64vl7tUMyCjAxRidbgr7eP\nhYX4HO+PiOZmxk36uPYp6GUuKYpZi7k2Mz9+HHr0gEd9H+VkxgYuXdIvRHWZ9HRwdy9dzLV+OUDD\nhsJmuHix5H474jcwzK306fvmyEPNH+VM9ga1wzAZEhLg/Hn923T9ci1ubrA2bAMTfCdgobGQmXkp\nmLWYN2smyu1CQkQp2QSfCWw7vxkX13wuyGaKRUhPF4sBlGaz6GbmgN6xh6vp10nRnOHV8UNqLlAj\npJdLLzLybxN9I1rtUEyC774TC33rQ9cv1+LmBnuThcUCSDEvBbMWc41GvBGsrMSyX14tvWjRqAWO\n3Y9Kq6UYlcnMQb9v/p8dW2iaOgyvdg1rLlAjxNnJgmbJE9gQKbPzipCcDJcu6d+m65drad8zltTM\n6/R17Ut+vpjZ3bJlzcdpapi1mIPw23r2LOz9McFnAg88NkgxL4Y2M6+IZw5CzCMiiu6zPmIDQ1zq\nlsUCovaciImsj5S+eUWorJhntduAEhHMrZv1SEuDxo3FQLykKGYv5u7u0KtX4fMJPhOIa7iJiEjZ\nFlcXbWZels2im5kPGgS//VZYNnYz4xaJyjFeHm1+E4XKw9ERbp3tS+r9VGJvyhlp5ZGcLKbo6xu3\n0ueZb7+0kUdaT2DlSmmxlIXZi/lHH8FLLxU+92vth3WD+py6ekq9oIyMBw9ESZizc9k2i+6HzMUF\n5s6Fv/9dPP/v3m00Sh5Ij851b7EAa2to1NCCEe7j2Ry1We1wjJ7kZJFZJyaW3FbcM49PiychPYHX\nJj3M0qV0pdD0AAAgAElEQVRSzMvC7MW8WTPxYdOi0Wh41G8C8Y02yn4af3Hnjsi67ezKtll0M3OA\n11+HQ4fEv59DN/BIqwkm08rW0Dg6Qu/mwWyK3qR2KEZNXp54j3Xrpr8aqrjNsjlqM2O8xjCwvyVp\nabB7tyxLLA2zF3N9TA6YAL4buXRJWi1QKNRNm4rJQfpuf4sPgILwLhctghdevcOFnAO8MGxU7QRs\nhDg6gnPOw1y8dZHEdD0ppwQQC020aCHmKujzzYuL+caojUzwmYCFBTzxhFiTQGbm+qmTYt7VsStW\nDbPZeSpc7VCMAq2YazTig3T7tv59inuZAFOnwj2n7dRLepghDzctuUMdwdERUlOsGO01mi3RW9QO\nx2i5elX8rtq1Kz0z177Pku8mE349nIHuAwGYMUNk9VLM9VMnxVyj0eCVH8yO+I1qh2IU6FoopVkt\n+jJzEF8AHiM2M71rMPXqcFdSR0fhBQd7B7MxSr6vSiM5WfyuPDz0Z+a6nvnWmK2M6DCiYDZxu3bw\n8MNSzEujToo5QJ8W4zmVIQeroGJiXlpmnpmTydEbv/Px7NE1G6SRoxXzwe0Gc+baGa7fv17+QXUQ\nrZiXlZlrxXxT1CYm+Ewosn3pUpGhS0pSZ8W8X5s+3M2/xsVbet5RdYziYq6vPLG0zHz3pd10cexC\nq8Z1O13SinlDy4YMbT+UbTHb1A7JKCmemSvFhq20Yn4r8xZHk44yrH3Rhm3u7uI9KilJtcQ8MTGR\n/v3707FjR/z8/Pj8888NFVeN08atHrbJY9kcLbNzXTFv0aJymfmmqE2M9x5fswGaAFoxB2G1bIqS\nVS360Ip5ixaiiVbx95rWM/8l5hcGegwsd9lBSSHVEnMrKys+/fRTIiIiOHr0KF999RVRJtJf1s0N\ncsOCpZgjhNrWVjyujGeek5fD9tjtUswpKuYjOozgUMIh0h+UsQZfHUUr5qDfN9dm5puiNxHsHVz7\nAZow1RJzBwcHOnXqBICNjQ0+Pj5cvXrVIIHVNA4OcC9sAJGpkSTfrdsrC5Rns+TmQmYm2NgUff3A\n5QO4N3fHtalr7QRqxDg6ikoNgCYNmvBwm4f59fyv6gZlhOiKeXHfPCvrr7JYq/v8EfcHozzrbqlr\nVbA01Ini4+M5ffo0PXv2LPL6woULCx4HBQURFBRkqEtWi3r1wLF1fTo5jmBrzFae7fas2iGpRnq6\n6LUC4vZXdzV07XZbW3FbrMvm6M0ye/oLW1vh/969C02awHjv8WyO3sxU/6lqh2ZUlJWZaytZfru4\ni54uPWneqLn+k5ghISEhhISEVOscBhHze/fuMXHiRJYsWYJNsfRNV8yNDVdX6Go9ns3R39V5MS+r\nmkWfX56v5LM5ejN7Z+ytnSCNHI1GtENITBTtgcd4jeHl318mMyfTLNdCrQipqeLLzcNDPM/Ph2vX\nimbmR48W7q+1WDZHb65z1l3xRPedd96p9DmqXc2Sk5PDhAkTmD59OuPGjavu6WoVNzdwyhjGkcQj\n3M7UM1OmjqCdzg/6xVyfX37iyglsG9ji3dK7doI0AQID4fRp8bhV41Z0cujEnkt71A1KRb7+WrR8\n0HLzprhr0a4i5OFR1Ga5fRtsm2ez4/wOxnqNrd1gzYBqibmiKMyZMwdfX1/mz59vqJhqDVdXSL1i\nQ3/3/nXa3yxezVLcM9fXl2VT9CaCfaTFokv37nDiROFzrdVSVzl3rujvQ9diAZGZF7dZlDYheNp5\n4mzrXHuBmgnVEvM///yTn3/+mT/++IPOnTvTuXNndu3aZajYahxXV3FbXNc/dOXZLMU7JiqKwuao\nuncrXB7FxXyc9zh+if2F3Pxc9YJSkXPnxOcrJUU8Ly7mLi6iV0tWlnh++zakO8r3VVWplpg/9NBD\n5Ofnc+bMGU6fPs3p06cZNsx0VmXXrhE62nM0ey7tITMnU+2QVKEinrluZh51I4oHuQ/o6ti19oI0\nAbp2hbNnRfUPQNtmbXG1deVQwiF1A1OBjAwh5I88UvgFV1zMLS1FQhUfL57fvJXPVdutjPeRYl4V\n6uwMUCjMzO2s7ejq2JXfL/6udkiqoCvW2nbBmZlFt+tm5pujNjPOexyautrvthRsbUW2qbsCU7BP\n3ZzLEB4O3t7Qp0/pYg6FvnlODvxx/hjWmuZ42nnWfsBmgBTzv7qV1lWrJScHsrOL9nwvPgu0+ABo\nXaw2qCjdu8PJk4XPx3uPZ+WpLWRn1612y+fOQUCA+H0cPy5e0yfm7drBBx+Iz+Kx9M2M9ZLvq6pS\np8Xczk6ssnPvnvA3t8dur3P+praGXDfJLm616GbmCekJxKfF069Nv9oN1EQo7ps3vOvLzZQGbDwS\nql5QKqAV8x49xO9DUfSL+cSJ0L8/7N+vYN11M88FSTGvKnVazDWawuzctakr7s3dOXD5gNph1Sr6\nKlWKzwLVzcy3RG9hlOcoLC0MNt/MrCgu5itWaCBqPBvC69Zdn1bMnZxEKWJ8vH4xHzAA3n8fspuF\nk52XTRfHLqrEaw7UaTEHabXoE/PiNotuZi4tlrIJDISoKHHHl58Py5dDN5vxHLxRdxpvKUqhmIPI\nzo8fF+0OnJz0H6N9X8lxmKpT58VcW9ECQsy3RG9BKd6X04wpLTPX55nfyLhBaHIoQ9oNqd0gTQhr\na7Ek2tmzYm1Ua2t4cngP7uemE3MjRu3waoUrV8SCzdq1OrW+ub7MXItMEqpPnRdz3czcp5UPja0a\nc+LqibIPMiMqYrNoM/NfYn5hkMegOjs9vaJoB0GXLYOZM8HbywLb5HF15q5PNysH8fvYswesrMS6\nscWJux3HlTtXeMjtodoL0gyRYq4j5lD3Ssl0p/JrKS0zl421Kkb37rB/P2zaBNOmiUw9M7TuWHjF\nxbxbN/FaaVn5lugtjPYaTT2LOrzuoAGQYu5aaLOAEPNNUZvqjNVSUc/c0vouIfEhjPQcWbsBmiDd\nu8OGDdC7txAwBwfIvfgI529eIOlOktrh1TjFxbx5c+jQQVosNU2dF3M3t6KZeVfHrmTmZBJ1wzQW\n2agu5XnmiiIy8yM3dtLXrS/NGupZbkhSBD8/4RnPnCmeazTQwcOK3naj2BK9RdXYaoPiYg5iEFSf\nmF+/f51zKecY5DGodoIzY+q8mGttFm0irtFoGO8zvs4s+6VPzFu2LJyVl5kper//ckEuD1dRrKxg\n9WrQbSLq6Qle+eZvtWRlifeOtj++lpEjoVevkvtvi9nG0PZDaWjZsHYCNGPqvJjb2Ig6WF1boS6t\n4ai7ZJyWHj2gbVvh9964AU3tHrDrwi7ZlrQSjB8vsnMtHTpAo6tDOHn1JDcz9KzLZyZERYlZndo2\nt1qmTIF580ruL9eQNRx1XsyhpNXykNtDJN1JIj4tXrWYagt9mbmVFWzcKAZHp04FS8+9BNgHYG9j\nr06QZoCnJ8Sft2aQxyC2xWxTO5waIywM/P0rtm/agzQOJRxiZAc5DmMIpJhTchC0nkU9xnqPZXOU\ned8Sg34xB2jYEDZvFnXSOe1k7/Lq0qEDnD8PE3wmsDFqo9rh1BiJidCmTcX23R67naC2QTRp0KRm\ng6ojSDFHWAraNpxagr2D2RRt/lZLaWIO0KgRbNycS177bYzzNq1VpIyNDh0gNhZGdhjFgcsHuJN1\nR+2QaoRr10T1TkXYFCWTBEMixZySq4QDDHAfQPj1cK7du6ZOULVEWWIOcPL6Qdo0d6Vts7a1FpM5\nYmcnFsTOvmtLvzb9+DXWPFe2KmuWpy73s++zN24vY7zG1HxQdQQp5ugX8waWDejdcjgrTph3KVl5\nYr4xaiMTfSfWXkBmikZTmJ2bs9VS0cx854Wd9HTuSYtGLWo+qDqCFHNEg3zdtQi1xP06kbfXbCwh\n9OZEWWKer+SzKWqTFHMD4ekpfPOxXmPZfWk3GTkZaodkcCqamUuLxfBIMUeIeXy86HKny/XDw8h3\nOk7fwTeKLDhgLuTliTpyGxv92w8nHqaldUu58ouB0A6C2lnb0d2pO79d+E3tkAxORTLzrNwsdpzf\nIcdhDIwUc0TFRvPmotubltRUyM+yZozvUCb8YwvDh0OMmTW9u3MHmjQRXq4+NkRukFm5AdHaLCDa\nRpib1XL3rph816Sc4pQ9l/bgb++Pg00FR0olFUKK+V8U982josQstom+E7nYYANDhhQuf2Uu6Jsw\npCVfyWdj1EYm+Eyo3aDMGK3NAqLd8q/nfyUrN0vdoAyINisvryX5hqgN8n1VA0gx/wvtwrJaoqOF\nmI/oMELYDa63ikwsMgfK8stPXDmBTX0bfFv51m5QZozWZlEUcGziiF9rP3Zf2q12WAajIn55dl42\nW6O3yju+GkCK+V+0a1d0EDQqSqwublPfhkEeg7jZchtJZtbw7vZtYS/pY0OUsFjkyi+Gw9ZWLNhw\n5ox4Psl3Eusj16sblAGpiF++59IefFr54GLrUjtB1SGqLea7du3C29ubDh068PHHHxsiJlUobrNo\nM3MQVktMvQ1ml5mnpekXc0VRhF/uI7MnQzN7Nnz9tXg8wXcCv8T8YjZWS0Uy8/WR63nU99HaCaiO\nUS0xz8vLY+7cuezatYvIyEhWr15NVJRpto7V55l7e4vHozxHEZVxgPjkdHWCqyHS0grX9tQlNDmU\nepp6BNgHlNwoqRZPPgnr1onBZ6cmTmZltVy7VraYS4ulZqmWmB8/fpz27dvTtm1brKysmDx5Mlu3\nbjVUbLWKrmd+/z5cvw7u7uK5bQNb+joHEd/QNH+20ihNzNdGrOUxv8ekxVIDODrCoEGwYoV4Pqnj\nJNZFrFM3KAORnFy2zSItlprFsjoHX7lyBVdX14LnLi4uHDt2rMg+CxcuLHgcFBREUFBQdS5ZY7Rq\nJfp3374tas7btxd9vLXM6DKZPe4ryciYgbW1amEalNu3S4q5oiisi1jHtinm29lPbZ57Dl58EZ5/\nXswGfeuPt8jKzaKBZYPyDzZiysvMpcVSOiEhIYSEhFTrHNUS84pkbrpibsxoNIWDoDExhRaLljFe\no1HcniPi0i26+5nHFOS0tMK7Dy3HrhyjkVUj/FtXsI+ppNL07w+5uXDoEPTr50iAfQC/X/yd0V6j\n1Q6tWpSVmWstlvf6v1e7QZkIxRPdd955p9LnqJbN4uzsTKLOqGBiYiIuLqZ7C6X1zXUHP7U0adAE\nu7QhrD1nPp0U9dksa8LXMLnjZGmx1CAaDTz7LPzvf+L5JN9JrIs0faulrAFQabHUPNUS827dunH+\n/Hni4+PJzs5m7dq1jBljul3QtGKunTBUHN+8yexMXFP7gdUQxW2WfCWf9ZHreczvMfWCqiM88QTs\n2AG3bomqlu2x23mQ+0DtsKqM1qJs1Ur/9jXha5jkO6l2g6pjVEvMLS0t+fLLLxk6dCi+vr489thj\n+OhTQRNBOwgaHV3SZgHo3nwElx6cJOVeSu0HVwMUL008lHCIVtat8G6p54eXGJTmzWHAANi2DRxs\nHOji2IUd53cU2ScvD958U6UAK8n162LtWN1xJi0ZORlsi9kmk4Qaptp15sOHDycmJoYLFy7wpqm8\n80qhXTvRO+PiRfDyKrndw7URrpmj2BC5ofaDqwGK2yxrwtfwWEf5gastJkwQy/MBTPWbysqwlUW2\nx8fDokWi54mxU9aEoV9jf6W7c3fZi6WGkTNAdWjXDo4eFW/KRo1Kbnd1BdvEx1gTYR5Wi66Y5+bn\nsjFqo8yeapFRo2D/flFzHuwTzJ5Le0h7kFawPTpa/H/1qkoBVoKy/PJV4auY6je1dgOqg0gx18HN\nTbTB1WexALi4QFbkECKuR5CYbvrTQXU9831x+2jTtA0ezT3UDaoO0bQp9OsH27dD80bNGeA+oMi6\ns1oxT05WKcBKUFpmfjvzNvvi9sne5bWAFHMdLC3FYrSl2f6urnDlcgOCfYJZHb66doMzMLm5kJFR\n2K50xbkVTA+Yrm5QdZDiVsuq8FUF26KjReWLKWfmm6I2MchjEE0blrGclcQgSDEvRvv2pWfmdnZi\nMYeJno+z4twKFEWp3eAMiLZjooUF3Mu+xy8xvzDZb7LaYdU5xo6FPXvErONRnqM4efUkyXdFKh4T\nA506mYaYl5aZrw5fLS2WWkKKeTGWLIHHSrGNNRphtbShH3ez7nI25WztBmdAdP3yLdFbeMjtIVo3\nbq1uUHUQOzvo0QN27YJGVo0Y6zWWtRFrAZGZ9+9vGmKuLzNPvpvMqeRTjOgwQp2g6hhSzIvh7V36\ngg3wl9WSZMH0gOmsOLei9gIzMLrtb6XFoi5FrBb/qawKW8XNm5CVBV26mIaY68vM14SvYazXWBpZ\n6akmkBgcKeaVxMUFkpLg8YDHWRW2itz8XLVDqhLazDz5bjLHrxxnjJfpTvYydcaNExOIsrJggPsA\nEu8k8ntoNN7e4OxsGmJePDNXFIWfzvzEE4FPqBdUHUOKeSVxdYXERPBq6YWrrSt7Lu1RO6QqoRXz\n1eGrGec9DmsrM+keZoI4OIhViI4eBUsLS3HXF7YUb29wcjJ+MVeUkpn5mWtnuJt9l0faPqJeYHUM\nKeaVxNWVghWHZgTOMFmrRVuWuOLcCh4PeFztcOo8gwaJgVCAWZ1mcSB9OR28cnF0FFmvMY+1p6eD\nlRU0blz42tKzS3ki8AksNFJiagv5m64kLi4UrDg02W8yv8b+yt0sE5iiV4y0NMi1CyP1fiqPtJHZ\nk9roirlvK1+sMl3JdPqdJk1ExdGdO+Wf4+ZN4b/XNsVb32bnZbM6bDUzAmfUfjB1GCnmlURrswC0\ntG5JUNsgo19cQFEgLKzoa2lpEGvzPbM6z6KehZ6GGpJapW9f8TdK/2sxq/oRsziVtxSouNVy6RL8\n8ouY+FYTnD1buOSdLsVb3/4a+yu+rXzlBLRaRop5JdG1WQCe7PIk34V+VyvXTk2t2nFnz0LxNUFu\npD0gjJXM6Tyn2nFJqk/DhtC7N4SEQHY2pB2azNHU37mVeavCYp6SIroXVvV9Uh4ffgj//nfJ169c\nKZqZLz27lJmdZtZMEJJSkWJeSZo3F1UH9+6J58PaDyPpThJhKWFlH/gXv/4qPqyVJSNDzE7VXrcy\nnDghWq3qNmwKz92Me8MutG3WtvInlNQIgwcLq+XiRWhj34zhHYazKmxVpcQciiYbhuLaNfj9d7hx\no/A6Wo4dg65d/4rhXgoHLh+Q63yqgBTzSqLRFM3OLS0smd15doWy85wcmDgR9u2r/HWjo8Xs0/j4\nyh978qT4PyFB53yNv2OU41OVP5mkxtD65tqVrmZ1msVPZ34yCjH/8Ufx3u3dG44cKbrtwAF4+GHx\nePnZ5YzzHodNfRvDByEpEynmVaB9e2FdaJnTeQ6rwlaRmZNZ5nFhYfDgAfz2W+WvGRkp/o+Lq/yx\nJ0+KmYaXL4vnF25d4E7DcIa0lbXlxkSnTsIi2bNHtGAe6D6Qmxk3ybM/WaFmWykpYrA00cA94PLy\n4NtvxepIffoUFfNbt4RX36WLWNzkm1Pf8EzXZwwbgKRCSDGvAlOmwNKlhc/bNGtDN6dubIzaWOZx\nx45BQICYul1ZIiPFXcGlS5U77sEDsXLSiBGFYv7j6R+xjZtB6xamvYCwuWFhIRasWL5cZOb1LOrx\nbLdnOW35vwpn5r6+hs/Md+2C1q2FldKnDxw+XLjtzz+hVy9Rmrj74m5sG9jS07mnYQOQVAgp5lVg\nwgQhzLoZ0NNdny7Xajl2DJ55RpSQ6VoeFSEyUnxoKpuZnzsHnp5CHBISRN/ypWeWYnFmTpFVhiTG\nwaBBYmxD2+xtTuc5nLy/icvXb5V7bEoKdOtmeDH/+muRlYPoI3P6dOG4z4ED8Mhfla3/O/k/nuv2\nnFw/ViWkmFeBRo1EMy7d7Hy052hib8YSlRoFiKqErKyixx07JjzHwYMrb7VERsLIkZUX85MnxQfc\nzU1k5pujNtO+RXvuxfuUWMxZoj6DBon/tWLeqnErBrqO4oLN0nKPTUkR2bMhbZaEBGGrTP6roWaT\nJsJmPHNGPN+/X/jlCekJHLh8gKn+skOiWkgxryJz5sBPPxXW9FrVs+KpLk/xxfEvUBR49NHC5kkg\n6roTE8HfH4YOrZyYP3ggjh0ypPI2y8mT0L27qIS5fBmWHFvC813mk5enfzUlibp4eIiKJzu7wtde\n7P08t9v9j7xyCshrIjM/dEhYP9Y63R60VsvduxARIbL170K/Y3rAdBrXb1z6ySQ1ihTzKtK1q8hS\nQkIKX3u++/OsDl/N2dhb3LgB63TmEp04AZ07iwUwhgyBvXvFAhEVISZGfMg9PUVmXpmp3SdOiA94\nmzZw/v5Jku4k0a/VWJo3Fx68xPgYUaxjbP/2vdDk2rD57O5Sj8nOFuLq7y/qvg01/T8hAdq2Lfpa\n795CzI8cEZ8DC6tsvg/9nme7PWuYi0qqhBTzKqLRiOz8hx8KX3OwcWCM1xgW7/uOoCD444/CGX3H\njkHPv8aFHBzEB+TYsYpdKzISOnYUi0k0aFD2pBDdD/H9+6Jm2d9fzCK80X4Jz3Wdy9079aTFYkJo\nNBpax/+N/574b6n7XL8OLVuK/ig2NoabOJSQICw6XbQVLdqSxE1Rm/Cy88K3la9hLiqpElLMq8G0\naeKW+Pbtwtfm95zPL9e+pP/AHIKCYNs28bqumEPlrJbISFGlAODuXrpvvny5+JLQDq6eOQN+flC/\nPqRmJqPx/JWhreYUWZhCYhp450whNPUw52+e17s9JQXs7cVjbZtmQ6BPzD08xJ3A6tXw8MMKiw8v\n5uXeLxvmgpIqI8W8GtjZiZVgtm8vfK2zY2cs0tvxwGMjkyYJq0VR9It5RUsUyxNzRYG334aFC8WK\n7zNnCi9fO/gJotLA/voU0q41l2Jugrg6NCao8fMsPrxY73ZdMS/ecqI6JCQIi04XjUZYLZcvQ5bz\nXjJzMhnlOcowF5RUmSqL+WuvvYaPjw+BgYEEBweTrvUT6hgjR4qFBbTk5UHW/pf47c6njBqlcOCA\nyJDr1RMfMi19+wov/Fb5FWdERBSKuYdH0UFQRYEZM0SWf+QIfP65mGn62WeFfvmD3Ad8c+obuuW9\nyOXLRVcZkpgGTk7gl/ECGyI3FKwRqkvxzNxQFS36MnMQVkvXrvBF6L94rc9rstWtEVDlv8CQIUOI\niIjg7NmzeHp68tFHHxkyLpNh+HDRs0I7mBkTA873R5GefZOzaQcZOBDefFNk5boDjvXrQ2CgqNkt\ni6wsMYW/QwfxvHhmHhYGBw8Kf97eXnxpLF8OH30k4urWDb479R09nXvi7+RFQgIyMzdBnJwgPbkl\njwc+zmfHPiuxvSZslvR0kZzoe6/MmAHPvhNKZGok0wKmVf9ikmpTZTEfPHgwFhbi8J49e5JUEw0h\nTABnZ5G5HD0qnh8/Dj261WNBvwUsDFnIpEkia+6pZ1JcQEDRtgD6OH9eCHiDvyZrengUFfPdu8UX\nim6Zobs7/OtfojmXh+cDPv7zY95+5O2C8kQp5qaHo6Poz/Jyr5f5PvR70h6kFdleEzaLNivXV/Xk\n4AC/31/MS71eon69+tW/mKTaWBriJD/++CNTpkzRu23hwoUFj4OCgggq3ovVDBgxQlgtDz0krI3u\n3cUaoR8c/IBmg/fTqNEjesU8MFBMhy4LXb8chFDr2iy7d8PTT5c8buZMUQK57NwPdHbsTFenrtxo\nA+vXQ4sWReuYJcaPttlWm2ZtGOU5iv+d+B9v9nuzYLu2xhzKt1nS0kRZbb1y2tiXZrEAXLp9id0X\nd/PNqG8q+ZNI9BESEkKIbp1zVVDKYNCgQYqfn1+Jf9u2bSvY5/3331eCg4P1Hl/O6c2GQ4cUJTBQ\nPO7eXVEOHhSPfzr9k/LIT48oBw4oSk5OyeOOHVOUTp3KPvfbbyvKP/9Z+DwrS1Hq1xfny8xUFBsb\nRbl1S/+xD3IeKM6fOCsnrpxQFEVRIiMVpUMHRXnqKUX5+uvK/YwSdbl0SVHc3MTj8JRwxX6xvXLn\nwZ2C7QMGKMru3eJxTIyitGun/zwnTyqKhYWi1KunKC1bKsqsWaVf87//VZSnn9a/7YnNTyhv7Xur\nCj+JpCJURTvLzMx37y59kgLA0qVL2bFjB3v37q3eN4qJ07OnyIQuXYLwcDE5CGB6wHTeP/A+ea4h\nWFoGlTjOz0947Dk5olGRPiIiIDi48Hn9+uJ2OjFR2C2+vqUPZv5w+gcCHQLp5iRSNjc3cZx2/U+J\n6eDsLN4nu3fD4MEdGdxuMJ8c+YSFQQuBkp65duJQcYvkxAmYNUv0W4mNLeyroo/SMvOwlDB2XdhF\n7AuxhvnhJAahyp75rl27WLx4MVu3bqVhw4aGjMnk0M7q/PhjMVCpXdjW0sKStx5+i7dD3kbRMyXP\n2lp8WKKjSz93cZsFCgdBxQdb/3EPch+w6NAi3n7k7YLXtBNKYmOlmJsa9evDypVi4PHKFXiv/3t8\ncfyLgsoWXTG3thb/btwoeZ4zZ0SrXUtL8PER9eL69oPSxfzNvW/y5kNvYtvA1kA/ncQQVFnMX3jh\nBe7du8fgwYPp3Lkzzz//vCHjMjlGjhS9Wrp3L/r6tIBpXLt3jR3nd+g9rqxB0PR0MWDp5VX0de0g\n6J49pYv5J4c/oatTV3o49yjyupubaIkrSxNNj/794W9/E02vnBu3ZVanWbyz/x1ycoQPrjsOUlpF\ni1bMQWTt3t7i7lAf+mrM98fvJyI1Qk7dN0KqPAB6/rz+mWh1laFDRXlicTG3tLBkybAl/G3H3xjo\nMZCGlkXvYgIDRZtafezaJaZLF7/xcXcXE4JiYsTkjeIkpify6dFPOfHUiRLb2rSB0FCZmZsqCxaI\nQfN//AMWvLMAry+9mOoxHzs77yIDmtqKFq3lB6LMMCxMJBBatGLet2/Ja12+XDQzVxSFv+/5O+/3\nf58GlrIXvrEhK/0NRKtWYnp///4ltw1rP4xA+0AW/1ly9l5gYOmZ+datMEbPYkAeHrBqFfTrJ26/\ni2B+NGsAAAwqSURBVPPq7lf5W4+/4d7cvcQ2baYlxdw0sbCAFSvgf/8Di6wWvN7ndf7v4N8LLBYt\n+jLz8+dFSaGtjjvi5aXf5svNFet+OjsXvrY2Yi1ZeVlM8ddfuSZRFynmBmTFCtHZUB+fDv2Uz459\nRtztonPxSxPznByRmesTc3d3uHNHv8XyR9wfHEs6xt/7/l1vHNpMS4q56dKypcik9+yBF3q+wIW0\naPAtusqVvvLEs2cLLRYt3t76xfzqVbG6kHZgPvV+Ki/99hJfj/xazvY0UuRfpZZo06wNr/R+hfm/\nzS/yuouLGIQqvuL5gQNiEQAnp5Ln8vAQ/xcX8+y8bF7Y+QL/GfofrK2sSx6IyMytrfVn9BLTYfhw\n2LkTGlo2ZGazn4htP5fU+4WtEvVl5rp+uZbSPPPig5/zds1jmv80errIJeGMFSnmtcgrvV8h5kYM\nP5/7ueA1jUZ/dr51K4wdq/88Dg6icqZ4lcuCvQvwaO7BeO/xpcbQpo3Mys2BESPEnZuigG16H/zy\npzF359yC7fpmgeoT83bthDeuXQZOi66Yb43eyomrJ3i3/7s18JNIDIUU81qkgWUD1k5cy0u/vURk\namTB6wEBRQdBFUW0ztVnsYD4Anj99aI1xNtjt7MuYh0/jf2pzDUYAwLESusS06ZDB9HC4dw5cVcX\n3Ow9zl47y/qI9YCw4qKiii6AcuaMSBx0adBACP/Fi0Vf14r57czbPL/jeX4Y80Opd3sS40CKeS0T\n6BDIooGLeHT9o9zPvi9eK5aZnzsnBrr8/Cp2zqQ7STy57UlWTViFnXXZ8/StrEQZpcT0GT5ctJFI\nSQEXh0YsHbeUuTvnEnszFg8PkXVv3Sr2TUkRTdt0O3dq0eebJySAs2sOkzZMYrLfZB5u83DN/0CS\naiHFXAVmd55NN6duPPfrcyiKUkLMtRZLRZZ1y8rNYsrGKczrOY+H3B6quaAlRofWN9dOGOrl0osP\nBnzA8JXDuX7/OvPmiVbIUDj4qe89pc83j7+s8KvmORrUa8C/Bv2r5n8YSbWRYq4CGo2G/474L+dS\nzvH6ntfx9VU4fx7efVe0rl2xonSLRZcHuQ8IXheMg40Df39If/WKxHwJChItlGNjC2d/PtnlSab6\nT2XUqlEMGXmfy5fh1Cn9frkWfeWJoY3+RULuKdZMXEM9i3I6ckmMAo2ib565oU6u0eidxi4R3My4\nybCVw+ju1J3OyV+SmGBBTo6oNHnrLTHlujQyczIZv3Y8TRs25efxP2NVr5TmLhKzZvhwMRCanCwG\nxkFM7pm5dSap91PpnbSW8xFNyM2FYcNEO4DiHDoEr74q2jgrisKSY0t4ecMnnHvxCH5uLrX7A0mA\nqmmnFHOVuZN1h5GrRuLezJ2vR31doUGm5LvJTN88HQcbB5aNW4alhUE6GUtMkM8/h/nzRTWK7pd/\ndl42c3fMJSTuANc+30CTTD927Cg5AAqiN0uHDpCUksEz25/m3LUILn6wiXtJ7hWy+iSGpyraKW0W\nlbFtYMuuabvIyc/B5ysf1oSvKfWPmJufy2dHP8P/f/70cunF8nHLpZDXcUaOFPMOit/F1a9Xn29H\nf8s/H1lAzrT+XHP5BvcOD/Sew85OId/1AL2+FXP6v+/9J22bSSE3NWRmbkQcuHyA+bvmY1XPiuHt\nhxNgH0C75u2IuhHF8SvH2XlhJy62Lnwx/Au8W3qrHa7ESMjNLduS+/VEOM9ufomMZqE81vExRnuO\nxtLCktz8XGJvxvJt6LfExSnM7foKHz82m7lzNdy7B8uW1d7PICmKtFnMgLz8PLbHbufE1ROcSznH\nhVsX8G7pTQ/nHvRx7UM/t35l1pFLJKWRkJ7A8rPL2Re3DwuNBZYWltjb2DO702yWvfcwvXpqyMqC\nb74RzbyaNlU74rqLFHOJRFIlFi+GdetEr/TDh6FtW7UjqttURTul4SqRSPD2Fu1xQ0KkkJsqMjOX\nSCTk5sKFC0LUJeojbRaJRCIxA2RpokQikdRRpJhLJBKJGSDFXCKRSMwAKeYSiURiBkgxl0gkEjNA\ninkZhISEqB1CtZDxq4spx2/KsYPpx18Vqi3mn3zyCRYWFty6dcsQ8RgVpv6GkPGriynHb8qxg+nH\nXxWqJeaJiYns3r2bNm3aGCoeiUQikVSBaon5yy+/zL/+JZeUkkgkErWp8gzQrVu3EhISwqeffoq7\nuzunTp2iRYsWRU8uu/tJJBJJlTBoo63Bgwdz7dq1Eq9/8MEHfPTRR/z+++9lXlhO5ZdIJJLaoUqZ\neXh4OAMHDsTaWixxlpSUhLOzM8ePH6d169YGD1IikUgkZWOQRlul2SwSiUQiqR0MUmcuvXGJRCJR\nF4OI+aVLl0pk5bt27cLb25sOHTrw8ccfG+IytUZiYiL9+/enY8eO+Pn58fnnn6sdUpXIy8ujc+fO\njB49Wu1QKk1aWhoTJ07Ex8cHX19fjh49qnZIleKjjz6iY8eO+Pv7M3XqVLKystQOqVRmz56Nvb09\n/v7+Ba/dunWLwYMH4+npyZAhQ0hLS1MxwrLRF/9rr72Gj48PgYGBBAcHk56ermKEZaMvfi2VmcdT\nIzNA8/LymDt3Lrt27SIyMpLVq1cTFRVVE5eqEaysrPj000+JiIjg6NGjfPXVVyYVv5YlS5bg6+tr\nkndO8+bNY8SIEURFRXHu3Dl8fHzUDqnCxMfH89133xEaGkpYWBh5eXmsWbNG7bBKZdasWezatavI\na4sWLWLw4MHExsYycOBAFi1apFJ05aMv/iFDhhAREcHZs2fx9PTko48+Uim68tEXP1R+Hk+NiPnx\n48dp3749bdu2xcrKismTJ7N169aauFSN4ODgQKdOnQCwsbHBx8eHq1evqhxV5UhKSmLHjh08+eST\nJldVlJ6ezsGDB5k9ezYAlpaWNDWh1YVtbW2xsrIiIyOD3NxcMjIycHZ2VjusUunXrx/Nmzcv8tq2\nbdt44oknAHjiiSfYsmWLGqFVCH3xDx48GAsLIW89e/YkKSlJjdAqhL74ofLzeGpEzK9cuYKrq2vB\ncxcXF65cuVITl6px4uPjOX36ND179lQ7lErx0ksvsXjx4oI3tCkRFxdHq1atmDVrFl26dOGpp54i\nIyND7bAqTIsWLXjllVdwc3PDycmJZs2aMWjQILXDqhQpKSnY29sDYG9vT0pKisoRVZ0ff/yRESNG\nqB1Gpdi6dSsuLi4EBARU+Jga+aSb4m29Pu7du8fEiRNZsmQJNjY2aodTYbZv307r1q3p3LmzyWXl\nALm5uYSGhvL8888TGhpK48aNjfo2vzgXL17ks88+Iz4+nqtXr3Lv3j1WrlypdlhVRqPRmOxn+oMP\nPqB+/fpMnTpV7VAqTEZGBh9++CHvvPNOwWsV+RzXiJg7OzuTmJhY8DwxMREXF5eauFSNkZOTw4QJ\nE5g+fTrjxo1TO5xKcfjwYbZt24a7uztTpkxh3759zJgxQ+2wKoyLiwsuLi50794dgIkTJxIaGqpy\nVBXn5MmT9OnTBzs7OywtLQkODubw4cNqh1Up7O3tCyYMJicnm+T8kaVLl7Jjxw6T+yK9ePEi8fHx\nBAYG4u7uTlJSEl27duX69etlHlcjYt6tWzfOnz9PfHw82dnZrF27ljFjxtTEpWoERVGYM2cOvr6+\nzJ8/X+1wKs2HH35IYmIicXFxrFmzhgEDBrB8+XK1w6owDg4OuLq6EhsbC8CePXvo2LGjylFVHG9v\nb44ePUpmZiaKorBnzx58fX3VDqtSjBkzhmXLlgGwbNkyk0todu3axeLFi9m6dSsNGzZUO5xK4e/v\nT0pKCnFxccTFxeHi4kJoaGj5X6hKDbFjxw7F09NTadeunfLhhx/W1GVqhIMHDyoajUYJDAxUOnXq\npHTq1EnZuXOn2mFViZCQEGX06NFqh1Fpzpw5o3Tr1k0JCAhQxo8fr6SlpakdUqX4+OOPFV9fX8XP\nz0+ZMWOGkp2drXZIpTJ58mTF0dFRsbKyUlxcXJQff/xRuXnzpjJw4EClQ4cOyuDBg5Xbt2+rHWap\nFI//hx9+UNq3b6+4ubkVfH6fe+45tcMsFW389evXL/j96+Lu7q7cvHmz3PMYZAaoRCKRSNTF9Eod\nJBKJRFICKeYSiURiBkgxl0gkEjNAirlEIpGYAVLMJRKJxAyQYi6RSCRmwP8DfGxwD8MDc2UAAAAA\nSUVORK5CYII=\n"
      }
     ],
     "prompt_number": 3
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<h2>Over and Under Fitting</h2>\n",
      "<p>This section describes some of the techniques used to account for over fitting or under fitting a given model when using a\n",
      "    maximum likelihood approach. </p>\n",
      "<h3>Regularized Least Squares</h3>\n",
      "<p>Regularization attempts to address the problem of overfitting a given model to the training data and/or eliminating parameters that are not important\n",
      "based on the data. The general total error function <em>with a regularization term</em> is given by <br/><br/>\n",
      "$E_D(\\mathbf{w}) + \\lambda E_W(\\mathbf{w})$ <br/><br/>\n",
      "where $\\lambda$ is the regularization coefficient and $E_W$ is the regularization term. A commonly used regularization term is the sum-of-squares of the\n",
      "model parameter elements <br/><br/>\n",
      "    $E_W(\\mathbf{w}) = \\frac1{2}\\mathbf{w}^T\\mathbf{w}$ <br/><br/>\n",
      "    known as the <em>weight decay</em> regularizer. This regularization terms leads to the optimal solution, assuming a linear regression model with \n",
      "    Gaussian noise on the training data, of <br/><br/>\n",
      "    $\\mathbf{w} = \\left(\\lambda \\mathbf{I} + \\mathbf{\\Phi}^T \\mathbf{\\Phi}\\right)^{-1} \\mathbf{\\Phi}^T\\mathbf{t}$\n",
      "</p>"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<h3>Example 4</h3>\n",
      "<p>In this example, we use the same training data as example 1(a), except that here, the model is erroneously chosen to be a 7th order polynomial. \n",
      "This example is somewhat contrived, but it illustrates the point that an overfit model can be corrected to some extend using regularization.</p>"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numpy as np\n",
      "from matplotlib import pyplot as plt\n",
      "#in order to compare between examples, set a seed in random\n",
      "seed = 123456789\n",
      "np.random.seed(seed)\n",
      "def y(x,m,b,mu=0,sigma=1): return m*x + b + np.random.normal(mu,sigma,1)[0]\n",
      "def el_pow(x,pow):\n",
      "    temp = x\n",
      "    for i in range(pow-1):\n",
      "        temp = temp * x\n",
      "    return temp\n",
      "def prediction(params, x):\n",
      "    pred = 0\n",
      "    for i in range(len(params)):pred += params[i]*math.pow(x,i)\n",
      "    return pred\n",
      "#training data, with N data points\n",
      "N = 101\n",
      "M = 8\n",
      "t = np.empty(N)\n",
      "domain = np.empty(N)\n",
      "domain_bound = 1.0/N\n",
      "for i in range(N): domain[i] = i*domain_bound\n",
      "for i in range(N): t[i] = y(x=domain[i],m=4.89,b=0.57)\n",
      "#find the solution without using regularization\n",
      "#design matrix, phi, N X M\n",
      "phi = np.array([np.ones(N),domain, el_pow(domain,2),el_pow(domain,3),el_pow(domain,4),el_pow(domain,5),el_pow(domain,6),el_pow(domain,7)]).T\n",
      "temp1 = np.linalg.inv(np.dot(phi.T,phi)) #inverse of phi.T X phi\n",
      "temp2 = np.dot(temp1, phi.T)\n",
      "w1 = np.dot(temp2,t) #solution\n",
      "print 'w1=',w1\n",
      "predicted_t = [prediction(w1,x) for x in domain]\n",
      "\n",
      "#find the regularized solution\n",
      "lam = 0.1\n",
      "temp1 = np.linalg.inv(lam*np.eye(M)+np.dot(phi.T,phi))\n",
      "temp2 = np.dot(temp1,phi.T)\n",
      "w2 = np.dot(temp2,t)\n",
      "print 'w2=',w2\n",
      "predicted_t_reg = [prediction(w2,x) for x in domain]\n",
      "\n",
      "#add some plots\n",
      "plt.plot(domain,t)\n",
      "plt.plot(domain,predicted_t)\n",
      "plt.plot(domain,predicted_t_reg)\n",
      "plt.legend((\"training\",\"un-regularized\",\"regularized\"), loc='lower right')\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "w1= [    2.67447838   -29.5236348    157.30608584  -100.87380088  -878.60832646\n",
        "  2223.43071676 -2000.28206982   631.1108615 ]\n",
        "w2= [ 1.41073906  1.26572925  2.4105707   1.43899706  0.67592376  0.0429147\n",
        " -0.57058274 -1.17864515]\n"
       ]
      },
      {
       "output_type": "display_data",
       "png": "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\n"
      }
     ],
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<h3>Locally Weighted Linear Regression</h3>\n",
      "<p>In attempting to predict a target value, $y$, for some new input $x$ and given a training set $\\mathbf{t}$, locally weighted linear regression weights \n",
      "    training inputs relative to their distance from the new input $x$. The adjusted regression model is one of finding $\\theta$ to minimize <br/><br/>\n",
      "    $\\sum_i w^{(i)} \\left(y^{(i)} - \\theta^Tx^{(i)}\\right)$ <br/><br/>\n",
      "    where <br/><br/>\n",
      "</p>\n",
      "<p>\n",
      "$w^{(i)} = \\exp \\left( -\\frac{\\left( x^{(i)} - x \\right)^2}{\\left( 2\\tau^2\\right)} \\right)$ <br/><br/>\n",
      "The parameter $\\tau$, called the **bandwidth** controls how the weight of a training input, $x^{(i)}$, falls off with distance from the new input, $x$. Also, notice that the weights, \n",
      "$w^{(i)}$, require that the training data is available for each evaluation of a new input $x$, making it a so-called <font color=\"red\">non-parametric</font> model.\n",
      "\n",
      "The solution is obtained as <br/><br/>\n",
      "$\\mathbf{w}_{ML} = \\left(\\mathbf{\\Phi}^T\\mathbf{W}\\mathbf{\\Phi}\\right)^{-1}\\mathbf{\\Phi}^T\\mathbf{W}\\mathbf{t}$ <br/><br/>\n",
      "    where $\\mathbf{W}$ is the $N \\times N$ weighting matrix with elements $w_{i,j} = \\left[w^{(i)}\\right]^2$ for $i=j$ and 0 otherwise. \n",
      "</p>\n",
      "<h3>Example 5</h3>\n",
      "Here we apply locally weighted regression to training data that is generated from a second order polynomial with Gaussian \n",
      "noise."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numpy as np\n",
      "from matplotlib import pyplot as plt\n",
      "#in order to compare between examples, set a seed in random\n",
      "seed = 123456789\n",
      "np.random.seed(seed)\n",
      "def y(x,coefs,inc_ran = True,mu=0,sigma=0.2): \n",
      "    ans = 0\n",
      "    for i in range(len(coefs)): ans += coefs[i]*math.pow(x,i)\n",
      "    if inc_ran: return ans + np.random.normal(mu,sigma,1)[0]\n",
      "    else: return ans\n",
      "#training data, with N = 101 data points\n",
      "N = 101\n",
      "M = 2\n",
      "t = np.empty(N)\n",
      "domain = np.empty(N)\n",
      "domain_bound = 3.0/N\n",
      "for i in range(N): domain[i] = i*domain_bound\n",
      "for i in range(N): t[i] = y(x=domain[i],coefs=[1.75, 0.25, -1.0])\n",
      "\n",
      "#first find the standard linear regression fit using model y = phi_0 + phi_1 * x\n",
      "#design matrix, phi, N X M\n",
      "phi = np.array([np.ones(N),domain]).T\n",
      "temp1 = np.linalg.inv(np.dot(phi.T,phi)) #inverse of phi.T X phi\n",
      "temp2 = np.dot(temp1, phi.T)\n",
      "w1 = np.dot(temp2,t) #solution\n",
      "predicted_t = [y(x,w1,inc_ran=False) for x in domain]\n",
      "\n",
      "#now construct the locally weighted solution\n",
      "def wt(x,x_i,tau=1): return math.exp(-(x_i-x)*(x_i-x)/(2*tau*tau))\n",
      "def lws(x, wt_func, td_x,td_y, Phi):\n",
      "    _M = Phi.shape[1]\n",
      "    _N = Phi.shape[0]\n",
      "    _W = np.zeros((_N,_N))\n",
      "    for i in range(_N): _W[i,i] = wt_func(x,td_x[i])\n",
      "    temp1 = np.linalg.inv(np.dot(np.dot(Phi.T,_W),Phi)) #inverse of phi.T X phi\n",
      "    temp2 = np.dot(np.dot(temp1,Phi.T),_W)\n",
      "    w1 = np.dot(temp2,t) #local solution for parameters\n",
      "    return y(x,w1,inc_ran=False)\n",
      "predicted_local = [lws(x, wt, domain, t, phi) for x in domain]  \n",
      "plt.plot(domain,t)\n",
      "plt.plot(domain,predicted_t)\n",
      "plt.plot(domain,predicted_local)\n",
      "plt.legend(('training','regression', 'local regression'),loc='lower left')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 5,
       "text": [
        "<matplotlib.legend.Legend at 0x10c5cc590>"
       ]
      },
      {
       "output_type": "display_data",
       "png": "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\njlBQJ4QQOfJ/ZIW5vbRpxF8AAAAASUVORK5CYII=\n"
      }
     ],
     "prompt_number": 5
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<h1>Bayesian View</h1>\n",
      "Here we consider a fully Bayesian approach to the regression problem. First note, that our fundamental **model** assumptions still hold. Namely, \n",
      "we assume that the observation we are trying to predict is modeled by <br/><br/>\n",
      "$t = y(\\mathbf{x},\\mathbf{w}) + \\epsilon$\n",
      "    <br/><br/>\n",
      "where $\\epsilon$ is a Gaussian distributed noise component. Additionally, the assumption of a linear dependence on the model parameters, $\\mathbf{w}$ also still holds: <br/><br/>\n",
      "$y(\\mathbf{x},\\mathbf{w}) = \\sum_{j=0}^{M-1} w_j\\phi_j(\\mathbf{x}) = \\mathbf{w}^T\\mathbf{\\phi}(\\mathbf{x})$ <br/><br/>\n",
      "\n",
      "Recall that the Bayesian approach implies that the *best* model parameters, $\\mathbf{w}$, are those that maximize the **posterior** probability, which from Bayes' Theorem is given by: <br/><br/>\n",
      "$p(\\mathbf{w}|\\mathbf{t}) = \\frac{p(\\mathbf{t}|\\mathbf{w})p(\\mathbf{w})}{p(\\mathbf{t})}$ <br/><br/>\n",
      "\n",
      "<h2>Prior Model</h2>\n",
      "The first step in formulating a Bayesian model is to construct a model for the *prior* probability model, $p(\\mathbf{w})$. **NOTE:** In general any probability distribution model could be chosen to \n",
      "model the prior. The appropriate choice is dependent on different factors including prior knowledge of the problem and mathematical convenience. Often, the prior is chosen to be the *conjugate prior* of the \n",
      "likelihood function. This is a choice of mathematical convenience becuase it implies that the *posterior* can be derived analytically. It is often a reasonable choice, as is this case here for \n",
      "the problem of linear regression. Thus, given the Gaussian distribution used for the likelihood function above, we assume a Gaussian distribution for our *prior* of the form: <br/><br/>\n",
      "$p(\\mathbf{w}) = ND(\\mathbf{w}|\\mathbf{m}_0,\\mathbf{S}_0)$ <br/><br/>\n",
      "where $\\mathbf{m}_0$ is the prior mean and $\\mathbf{S}_0$ is the prior covariance. We will *assume* $\\mathbf{m}_0 = 0$ and an infinitely broad prior so that $\\mathbf{S}_0=\\alpha^{-1}\\mathbf{I}$ where $\\alpha$\n",
      "is a precision parameter that we will have to choose. Given these choices of *prior* and *likelihood* functions the *posterior* probability is given by <br/><br/>\n",
      "$p(\\mathbf{w}|\\mathbf{t}) = N\\left(\\mathbf{w}|\\mathbf{m}_N, \\mathbf{S}_N\\right)$ <br/><br/>\n",
      "where <br/><br/>\n",
      "$\\mathbf{m}_N = \\beta \\mathbf{S}_N \\mathbf{\\Phi}^T \\mathbf{t}$ <br/><br/>\n",
      "$\\mathbf{S}_N^{-1} = \\alpha\\mathbf{I} + \\beta \\mathbf{\\Phi}^T\\mathbf{\\Phi}$\n",
      "\n",
      "where $\\beta = 1/\\sigma^2$ is the inverse variance of the random noise component associated with the target variable, $t = y(\\mathbf{x},\\mathbf{w}) + ND(0, \\sigma^2)$. \n",
      "Finally, the log of the *posterior* is seen to be the sum of the log likelihood **and** the log of the prior: <br/><br/>\n",
      "$\\ln p(\\mathbf{w}|\\mathbf{t}) = -\\frac{\\beta}{2}\\left[\\sum_{n=1}^N\\\\{t_n - \\mathbf{w}^T \\phi(\\mathbf{x}_n)\\\\}^2\\right] - \\frac{\\alpha}{2}\\mathbf{w}^T\\mathbf{w} + constant$ <br/><br/>\n",
      "\n",
      "**NOTE:** <font color=\"red\">Maximizing the posterior function with respect to $\\mathbf{w}$ __under the assumption of Gaussian noise and a Gaussian prior__ is equivalent to the least-squares error solution \n",
      "with the addition of a regulariztion term $\\lambda = \\alpha/\\beta$.</font>\n",
      "\n",
      "Rather than find a point estimate for $\\mathbf{w}$ by maximizing the posterior and thereby make point predictions for the target variable $t$, it is more instructive to use the posterior \n",
      "to formulate a *predictive distribution* for $t$. For **our model assumptions** this is given by <br/><br/>\n",
      "$p(t|\\mathbf{t},\\alpha,\\beta) = \\int p(t|\\mathbf{w},\\beta) p(\\mathbf{w}|\\mathbf{t}, \\alpha, \\beta) d\\mathbf{w} =\n",
      "ND(t|\\mathbf{m}_N^T\\phi(\\mathbf{x}), \\frac{1}{\\beta} + \\phi(\\mathbf{x})^T \\mathbf{S}_N \\phi(\\mathbf{x})$ <br/><br/>\n",
      "where a point estimate of $t$ is given my the mean $\\mu = \\mathbf{m}_N^T\\phi(\\mathbf{x})$ and an estimate of the uncertainty is given by the standard deviation \n",
      "$\\sigma_N^2(\\mathbf{x}) = \\frac{1}{\\beta} + \\phi(\\mathbf{x})^T \\mathbf{S}_N \\phi(\\mathbf{x})$\n",
      "\n",
      "There is one final issue with completing the Bayesian model, namely the determination of $\\alpha$ and $\\beta$. This can be done in a fully Bayesian manner by developing prior models but\n",
      "this tends to make the equations intractible. Instead the so called *evidence function* approach is used. See section 3.5 of Bishop for more detail."
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<h3>Example 6</h3>\n",
      "Use the data provided in example 5 to formulate a Bayesian model. Here we know that $\\beta = (1/0.2) = 5$. For this example, we will simply choose $\\alpha = .4$ so that $\\alpha/\\beta = 0.08$ (See Bishop 3.5 for methods\n",
      "on determining $\\alpha$ and $\\beta$."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numpy as np\n",
      "from matplotlib import pyplot as plt\n",
      "#in order to compare between examples, set a seed in random\n",
      "seed = 123456789\n",
      "np.random.seed(seed)\n",
      "alpha = 0.4\n",
      "beta = 5.0\n",
      "def y(x,coefs, mu=0, sigma=1.0/beta): \n",
      "    ans = 0\n",
      "    for i in range(len(coefs)): ans += coefs[i]*math.pow(x,i)\n",
      "    return ans + np.random.normal(mu,sigma,1)[0]\n",
      "    \n",
      "#training data, with N = 101 data points\n",
      "N = 101\n",
      "M = 4\n",
      "t = np.empty(N)\n",
      "domain = np.empty(N)\n",
      "domain_bound = 3.0/N\n",
      "for i in range(N): domain[i] = i*domain_bound\n",
      "for i in range(N): t[i] = y(x=domain[i],coefs=[1.75, 0.25, -1.0])\n",
      "\n",
      "#Let's assume that we want to fit a 3rd order polynomial to the data even though we know its a second order\n",
      "#polynomial. Given the Bayesain approach, we should see the so that the unecessary terms are damped out. We have \n",
      "#y = phi_0 + phi_1 * x + phi_2 x^2 + phi_3 x^4\n",
      "#design matrix, phi, N X M where N = 101 and M = 4\n",
      "d2 = domain * domain\n",
      "phi = np.array([np.ones(N),domain, d2, d2 * domain]).T\n",
      "alphaI = alpha * np.eye(M)\n",
      "SN = np.linalg.inv(alphaI + beta * np.dot(phi.T,phi)) #posterior variance\n",
      "mN = beta * np.dot(np.dot(SN, phi.T), t)\n",
      "point_estimates = [np.dot(mN, phi[i]) for i in range(N)]\n",
      "uncertain_t = [1.0/beta + np.dot(np.dot(phi[i].T, SN), phi[i]) for i in range(N)]\n",
      "plt.plot(domain,t)\n",
      "plt.errorbar(domain,point_estimates, uncertain_t, ecolor = \"red\")\n",
      "plt.legend(('training','Bayes'),loc='lower left')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 6,
       "text": [
        "<matplotlib.legend.Legend at 0x10c60fe10>"
       ]
      },
      {
       "output_type": "display_data",
       "png": "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\ngM2tAAAAAElFTkSuQmCC\n"
      }
     ],
     "prompt_number": 6
    },
    {
     "cell_type": "code",
     "collapsed": true,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 6
    }
   ],
   "metadata": {}
  }
 ]
}